#include "musiclist.h"
#include <QMimeDatabase>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlError>

MusicList::MusicList()
{

}
//将List<QUrl>音乐列表中的信息管理到QVector<Music>中
void MusicList::addMusicsByUrl(const QList<QUrl> &musicUrls)
{
    //将所有的音乐放置到musicList中
    for(const QUrl e : musicUrls)
    {
        //进行一次文件重复度过滤
        //如果该文件已经在MusicList中，就不再进行添加了
        //过滤方式：将当前将要添加到musicList中的文件路径与music'L'ist中已经存在的歌曲文件路径对比
        //         如果相同则歌曲已经存在，如果不同说明此Music还没有添加过，添加即可。
        //遍历一下
        //查找的算法 O(n)
        #if 0
        iterator it=begin();
        for(;it!=end();it++)
        {
            if(it->getMusicUrl()==e)
            {
                //此时，说明此Music已经重复了
                break;
            }
        }
        //如果已经重复，it一定不会到end()，重复就循环下一个即可
        if(it!=end())
        {
            continue;
        }
        #endif

        //查找最快的方式 hash O(1)
        //拿到歌曲的本地路径
        QString musicPath=e.toLocalFile();
        //如果此歌曲的路径在此hash中存在，就说明重复了，进行下一次循环即可
        if(musicPaths.contains(musicPath)==true)
        {
            continue;
        }
        //此处，说明此歌曲本地路径不在hash中，添加进来即可
        musicPaths.insert(musicPath);

        //如果musicUrl是一个有效的歌曲文件，再将其添加到歌曲列表中
        //验证方式：检测歌曲的MIME类型
        //要使用MIME类型进行检测，需要QMimeDatabase对象
        QMimeDatabase mimeDB;
        //获取此mimeDB的MIME类型  e.toLocalFile()将url转化为字符串类型
        QMimeType mimeType=mimeDB.mimeTypeForFile(e.toLocalFile());
        //获取MIME名称
        QString mime=mimeType.name();


        //mime 和 audio/mepg(表示MP3文件)  audio/flac(表示无损音乐文件)  audio/wav(也是一种音乐文件)
        //如果符合这三种，就创建Music对象，并将其管理到MusicList中
        if(mime=="audio/mpeg" || mime=="audio/flac" || mime=="audio/wav")
        {
            //有效的音乐文件
            //需要将url创建一个Music对象，添加到musicList中
            Music music(e);
            //将这个music对象添加到musicList中
            musicList.push_back(music);
        }
    }
}
//通过音乐UUID获取到Music音乐对象
iterator MusicList::findMusicByMusicId(const QString &musicId)
{
    //遍历musicList寻找
    for(iterator it=begin();it!=end();++it)
    {
        //用UUID去对比，匹配就返回此Music迭代器(指针)
        if(it->getMusicId()==musicId)
        {
            return it;
        }
    }
    return end();
}

iterator MusicList::begin()
{
    return musicList.begin();
}

iterator MusicList::end()
{
    return musicList.end();
}
//将MusicList音乐列表信息写入到数据库中
void MusicList::writeToDB()
{
    //遍历musicList音乐列表
    for(Music music : musicList)
    {
        //拿到每个music对象之后，将music的所有属性写入到数据库
        //具体写入单个Music对象的操作也将其封装成一个函数
        //将此music对象的属性信息写入到数据库中
        music.InsertMusicToDB();

    }
}
//将数据库中的信息加载到musicList音乐列表和musicPaths[过滤重复加载]中
void MusicList::readFromDB()
{
    //构建sql语句对象
    QSqlQuery query;
    query.prepare("select musicId,musicName,musicSinger,albumName,\
                          musicUrl,duration,isLike,isHistory from MusicInfo");
    //执行sql语句
    if(query.exec()==false)
    {
        //执行失败
        qDebug()<<"数据库查询失败:"<<query.lastError().text();
        return;
    }
    //拿到信息，构建Music对象，将其插入到MusicList中
    while(query.next()==true)
    {
        //构建Music对象
        Music music;
        music.setMusicId(query.value(0).toString());
        music.setMusicName(query.value(1).toString());
        music.setMusicSinger(query.value(2).toString());
        music.setMusicAlbumn(query.value(3).toString());
        music.setMusicUrl("file:///" + query.value(4).toString());
        music.setMusicDuration(query.value(5).toLongLong());
        music.setIsLike(query.value(6).toBool());
        music.setIsHistory(query.value(7).toBool());
        //将此构建好的Music对象插入到MusicList中
        musicList.push_back(music);
        //恢复musicPaths，防止相同目录下的歌曲被重复加载
        musicPaths.insert(music.getMusicUrl().toLocalFile());
    }
}
